/**
 * 
 */
package kr.pe.johnkim.dayve.activity;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONException;

import kr.pe.johnkim.dayve.provider.DayveCategory;
import kr.pe.johnkim.dayve.provider.DayveCategoryDatabaseHandler;
import kr.pe.johnkim.dayve.provider.DayveGroup;
import kr.pe.johnkim.dayve.provider.DayveGroupInformationAdapter;
import kr.pe.johnkim.dayve.provider.DayveItem;
import kr.pe.johnkim.dayve.provider.DayveItemDatabaseHandler;
import kr.pe.johnkim.dayve.provider.DayveLog;
import kr.pe.johnkim.dayve.rest.DayveCategoryRest;
import kr.pe.johnkim.dayve.rest.DayveCommonRest;
import kr.pe.johnkim.dayve.rest.DayveGroupRest;
import kr.pe.johnkim.dayve.util.DayveCommon;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

/**
 * My History Group 정보를 출력하는 화면 클래스 이다.
 * 
 * @author johnkim
 *
 */
public class DayveGroupInformationView extends ListActivity {
	
	public static final String TAG = DayveGroupInformationView.class.getSimpleName();
	
	// 현재 시간.
	private String currentDate;
	
	// 프로그레스 바.
	ProgressBar groupInformationProgressBar;
	
	// Adapter Class.
	private DayveGroupInformationAdapter dayveGroupInformationAdapter;
	
	// DatabaseHandler
//	private DatabaseHandler dbHandler;
	
	private DayveCategoryDatabaseHandler categoryDatabaseHandler;
	
	// Category 목록을 화면에 출력하기 위한 list.
	private ArrayList<DayveCategory> categoryViewList = null;
	
	private ArrayList<DayveCategory> categoryList = null;

	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 101;

	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 102;

	// category 목록을 가져 와서 출력 한다.
	private static final int THREAD_GROUP_CATEGORY_LIST = 103;

	// category 목록을 업데이트 한다.
	private static final int THREAD_GROUP_CATEGORY_REFRESH = 104;

	// 목록 가져오기에 성공하면 Toast 를 띄운다.
	private static final int THREAD_GROUP_CATEGORY_LIST_SUCCESS = 105;

	// 목록 가져오기에 실패하면 Dialog 를 띄운다.
	private static final int THREAD_GROUP_CATEGORY_LIST_FAIL = 106;

	// Group 을 수정 한다.
	private static final int THREAD_GROUP_UPDATE = 107;

	// Group 수정에 성공하면 toast 를 띄운다.
	private static final int THREAD_GROUP_UPDATE_SUCCESS = 108;

	// Group 수정에 실패하면 dialog 창을 띄운다.
	private static final int THREAD_GROUP_UPDATE_FAIL = 109;

	// Group 을 비활성화 한다.
	private static final int THREAD_GROUP_DEACTIVATE = 110;

	// Group 비활성화에 성공하면 toast 를 띄운다.
	private static final int THREAD_GROUP_DEACTIVATE_SUCCESS = 111;

	// Group 비활성화에 실패하면 dialog 창을 띄운다.
	private static final int THREAD_GROUP_DEACTIVATE_FAIL = 112;
	
	// 한번에 가져올 category 목록의 갯수. 스크롤 이벤트가 없으므로 한번에 다 가져 온다.
	private int categoryCount = 1000000;
	
	
	private String groupId = "";
	private String groupName = "";
	private String groupComment = "";
	private String groupOpenGroupYn = "";
	private String groupFavoriteYn = "";
	private String groupActivateYn = "";
	private String groupRegisterDate = "";
	
	private String DAYVE_ID = "";
	
	// Group icon.
	ImageView imgViewGroupInformationGroupIcon;
	
	// 선택한 아이콘 파일 명.
	public static String DAYVE_GROUP_ICON_NAME = "";

	// Group Name.
	TextView txtViewGroupInformationGroupName;
	
	// Group Comment.
	TextView txtViewGroupInformationGroupComment;
	
	// 아이콘 선택 화살표.
	ImageView imgViewGroupIconSelect;

	// 수정 버튼.
	ImageView imgViewGroupInformationEdit;
	
	// 카테고리 생성 버튼.
	ImageView imgViewMenuRegister;
	
	// 삭제 버튼.
	ImageView imgViewGroupInformationDelete;
	
	// 뒤로 가기 버튼.
	ImageView imgViewGroupInformationBack;
	
	// 저장 버튼.
	ImageView imgViewGroupInformationSave;
	
	// Group Name 입력 란.
	EditText edtTextGroupInformationGroupName;
	
	// Group Comment 입력 란.
	EditText edtTextGroupInformationGroupComment;
	
	// Group Notification.
	TextView txtViewGroupInformationNotification;
	
	DayveGroupRest dayveGroupRest = new DayveGroupRest();
	DayveCategoryRest dayveCategoryRest = new DayveCategoryRest();
	DayveCommonRest dayveCommonRest = new DayveCommonRest();
	DayveCommon dayveCommon = new DayveCommon();
	
	// 모드 선택.(COMMON / EDIT)
	private String MODE = "COMMON";
	
	LinearLayout linearLayoutGroupInformationGroupNameCommon;
	LinearLayout linearLayoutGroupInformationGroupNameEdit;
	LinearLayout linearLayoutGroupInformationGroupCommentCommon;
	LinearLayout linearLayoutGroupInformationGroupCommentEdit;
	
	// Group 수정 결과.
	private String RESULT_UPDATE_GROUP = "";

	// Group 비활성화 결과.
	private String RESULT_DEACTIVE_GROUP = "";
	
	public static String ACTIVITY_RESULT = "";
	
	public static String RESULT_CATEGORY_REGISTER = "";

	/* (non-Javadoc)
	 * @see android.app.Activity#onCreate(android.os.Bundle)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.dayve_group_information);
		
		Intent i = getIntent();
		
		groupId = i.getStringExtra("groupId");
		groupName = i.getStringExtra("groupName");
		groupComment = i.getStringExtra("groupComment");
		DAYVE_GROUP_ICON_NAME = i.getStringExtra("groupIconUrl");
		groupOpenGroupYn = i.getStringExtra("groupOpenGroupYn");
		groupFavoriteYn = i.getStringExtra("groupFavoriteYn");
		groupActivateYn = i.getStringExtra("groupActivateYn");
		groupRegisterDate = i.getStringExtra("groupRegisterDate");
		
		Log.i(TAG, "groupId      : " + groupId);
		Log.i(TAG, "groupName    : " + groupName);
		Log.i(TAG, "groupComment : " + groupComment);
		Log.i(TAG, "groupIconUrl : " + DAYVE_GROUP_ICON_NAME);
		
		// 레이아웃을 정의 한다.
		linearLayoutGroupInformationGroupNameCommon = (LinearLayout)findViewById(R.id.linearLayoutGroupInformationGroupNameCommon);
		linearLayoutGroupInformationGroupNameEdit = (LinearLayout)findViewById(R.id.linearLayoutGroupInformationGroupNameEdit);
		linearLayoutGroupInformationGroupCommentCommon = (LinearLayout)findViewById(R.id.linearLayoutGroupInformationGroupCommentCommon);
		linearLayoutGroupInformationGroupCommentEdit = (LinearLayout)findViewById(R.id.linearLayoutGroupInformationGroupCommentEdit);
		
		linearLayoutGroupInformationGroupNameCommon.setVisibility(View.VISIBLE);
		linearLayoutGroupInformationGroupNameEdit.setVisibility(View.INVISIBLE);
		linearLayoutGroupInformationGroupCommentCommon.setVisibility(View.VISIBLE);
		linearLayoutGroupInformationGroupCommentEdit.setVisibility(View.INVISIBLE);
		
		// SharedPreferences 정보를 확인 한다.
		confirmNotification();
				
		// DatabaseHandler 를 연다.
//		dbHandler = DatabaseHandler.open(getApplicationContext());
//		categoryDatabaseHandler = DayveCategoryDatabaseHandler.open(getApplicationContext());
		
		// 현재 시간을 가져 온다.
		currentDate = dayveCommon.getCurrentDate();
		
		// 프로그레스 바를 세팅 한다.
		groupInformationProgressBar = (ProgressBar)findViewById(R.id.groupInformationProgressBar);
		
		// 그룹 아이콘 화살표.
		imgViewGroupIconSelect = (ImageView)findViewById(R.id.imgViewGroupIconSelect);
		// 화면이 출력되면 화살표는 출력하지 않는다.
		imgViewGroupIconSelect.setVisibility(View.INVISIBLE);
		
		imgViewGroupIconSelect.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub

				// 수정 모드일때 Group icon 선택이 가능 하다.
				if(("EDIT").equals(MODE)) {
					Intent i = new Intent(DayveGroupInformationView.this, DayveGroupSelectIconView.class);
					i.putExtra("parent_activity_name", "DayveGroupInformationView");
					startActivityForResult(i, 0);
				}
			}

		});
		
		// Group icon 을 세팅 한다.
		imgViewGroupInformationGroupIcon = (ImageView)findViewById(R.id.imgViewGroupInformationGroupIcon);
		imgViewGroupInformationGroupIcon.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub

				// 수정 모드일때 Group icon 선택이 가능 하다.
				if(("EDIT").equals(MODE)) {
					Intent i = new Intent(DayveGroupInformationView.this, DayveGroupSelectIconView.class);
					i.putExtra("parent_activity_name", "DayveGroupInformationView");
					startActivityForResult(i, 0);
				}
			}

		});

		// Group Name 을 세팅 한다.
		txtViewGroupInformationGroupName = (TextView)findViewById(R.id.txtViewGroupInformationGroupName);
		txtViewGroupInformationGroupName.setText("  " + groupName + "  ");
		
		// Group Comment 를 세팅 한다.
		txtViewGroupInformationGroupComment = (TextView)findViewById(R.id.txtViewGroupInformationGroupComment);
		txtViewGroupInformationGroupComment.setText("  " + groupComment + "  ");
		
		// Group Name 입력 란을 세팅 한다.
		edtTextGroupInformationGroupName = (EditText)findViewById(R.id.edtTextGroupInformationGroupName);
		
		// Group Comment 입력 란을 세팅 한다.
		edtTextGroupInformationGroupComment = (EditText)findViewById(R.id.edtTextGroupInformationGroupComment);
		
		// Group Notification.
		txtViewGroupInformationNotification = (TextView)findViewById(R.id.txtViewGroupInformationNotification);
		txtViewGroupInformationNotification.setVisibility(View.INVISIBLE);
		
		// 수정 버튼을 설정 한다.
		imgViewGroupInformationEdit = (ImageView)findViewById(R.id.imgViewGroupInformationEdit);
		imgViewGroupInformationEdit.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				MODE = "EDIT";
				
				linearLayoutGroupInformationGroupNameCommon.setVisibility(View.INVISIBLE);
				linearLayoutGroupInformationGroupNameEdit.setVisibility(View.VISIBLE);
				linearLayoutGroupInformationGroupCommentCommon.setVisibility(View.INVISIBLE);
				linearLayoutGroupInformationGroupCommentEdit.setVisibility(View.VISIBLE);
				
				imgViewGroupIconSelect.setVisibility(View.VISIBLE);
				
				edtTextGroupInformationGroupName.setText(groupName);
				edtTextGroupInformationGroupComment.setText(groupComment);
			}
			
		});
		
		// 카테고리 생성 버튼을 설정 한다.
		imgViewMenuRegister = (ImageView)findViewById(R.id.imgViewMenuRegister);
		imgViewMenuRegister.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				// 목록에서 터치했을때처럼 onResume 에서 구별하기 위해서 설정 한다.
				ACTIVITY_RESULT = "ON";
				
				Intent dayveMainView = new Intent(DayveGroupInformationView.this, DayveCategoryRegisterView.class);
				
				dayveMainView.putExtra("groupId", groupId);
				
				startActivityForResult(dayveMainView, 0);
			}
			
		});
		
		// 삭제 버튼을 설정 한다.
		imgViewGroupInformationDelete = (ImageView)findViewById(R.id.imgViewGroupInformationDelete);
		imgViewGroupInformationDelete.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				new AlertDialog.Builder(DayveGroupInformationView.this)
				.setTitle("그룹 삭제 확인.")
				.setMessage(txtViewGroupInformationGroupName.getText().toString().trim() + " 그룹을 삭제 하시겠습니까?" + "\n" + "연결된 카테고리와 아이템들도 같이 삭제됩니다.")
				.setPositiveButton("확인", 
					new DialogInterface.OnClickListener() {
						
//						@Override
						public void onClick(DialogInterface dialog, int which) {
							// TODO Auto-generated method stub
							mHandler.sendMessage(mHandler.obtainMessage(THREAD_GROUP_DEACTIVATE));
						}
					})
				.setNegativeButton("취소", new DialogInterface.OnClickListener() {
					
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
					}
				})
				.show();
			}
			
		});
		
		// 뒤로 가기 버튼을 설정 한다.
		imgViewGroupInformationBack = (ImageView)findViewById(R.id.imgViewGroupInformationBack);
		imgViewGroupInformationBack.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				MODE = "COMMON";
				
				linearLayoutGroupInformationGroupNameCommon.setVisibility(View.VISIBLE);
				linearLayoutGroupInformationGroupNameEdit.setVisibility(View.INVISIBLE);
				linearLayoutGroupInformationGroupCommentCommon.setVisibility(View.VISIBLE);
				linearLayoutGroupInformationGroupCommentEdit.setVisibility(View.INVISIBLE);
				
				imgViewGroupIconSelect.setVisibility(View.INVISIBLE);
				
				// 열려진 soft keyboard 를 닫는다.
				InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
				imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
			}
			
		});
		
		/**
		 * 저장 버튼을 설정 한다.
		 * 
		 * 그룹명 입력 유무를 확인 한다.
		 */
		imgViewGroupInformationSave = (ImageView)findViewById(R.id.imgViewGroupInformationSave);
		imgViewGroupInformationSave.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				if(("").equals(edtTextGroupInformationGroupName.getText().toString().trim())) {
					new AlertDialog.Builder(DayveGroupInformationView.this)
					.setTitle("그룹명 입력 확인.")
					.setMessage("그룹명을 입력 하세요.")
					.setPositiveButton("확인", 
						new DialogInterface.OnClickListener() {
							
//							@Override
							public void onClick(DialogInterface dialog, int which) {
								// TODO Auto-generated method stub
							}
						}).show();
				} else {
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_GROUP_UPDATE));
				}
			}
			
		});

		// 화면에 출력하기 위한 Category list 생성.
		categoryViewList = new ArrayList<DayveCategory>();
		
		// 프로그레스 바를 출력 한다.
		groupInformationProgressBar.setVisibility(View.VISIBLE);
		
		// Group 의 Category 목록을 가져 온다.
//		categoryViewList = categoryDatabaseHandler.selectCategoryListForGroup(groupId);
//		
//		categoryDatabaseHandler.close();
//		
//		Log.i(TAG, "categoryViewList.size() : " + categoryViewList.size());
		
		// Category 목록 가져오기가 끝나면 프로그레스 바를 감춘다.
		groupInformationProgressBar.setVisibility(View.INVISIBLE);
		
		dayveGroupInformationAdapter = new DayveGroupInformationAdapter(getApplicationContext(), categoryViewList);
		
		// list view 의 cursor 를 제공 하기 위해서 어댑터를 세팅 한다.
		setListAdapter(dayveGroupInformationAdapter);
		
		//List 레이아웃 그리기 캐쉬를 설정 한다.
		getListView().setAlwaysDrawnWithCacheEnabled (true);
		
		
	}
	
	/**
	 * SharedPreferences 정보를 확인 한다.
	 */
	public void confirmNotification() {
		String myPf = "kr.pe.johnkim.dayve.activity_preferences";
		SharedPreferences mSharedPreferences = getSharedPreferences(myPf, Activity.MODE_PRIVATE);
		
		// id 를 가져 온다.
		DAYVE_ID = mSharedPreferences.getString("dayve_id", "");
	}
	
	/**
	 * Handler 를 정의한다.
	 * 모든 Thread 를 등록해 놓고 필요할때 호출한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			// 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
				groupInformationProgressBar.setVisibility(View.VISIBLE);
				txtViewGroupInformationNotification.setVisibility(View.VISIBLE);
				break;
			// 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				groupInformationProgressBar.setVisibility(View.INVISIBLE);
				txtViewGroupInformationNotification.setVisibility(View.INVISIBLE);
				break;
			// Category 목록을 가져 와서 출력 한다.
			case THREAD_GROUP_CATEGORY_LIST : 
				
				categoryViewList.clear();

				runOnUiThread(selectCategoryList);
				
				break;
			// Category 목록을 업데이트 한다.
			case THREAD_GROUP_CATEGORY_REFRESH : 
				
				dayveGroupInformationAdapter.notifyDataSetChanged();
				
				threadSelectCategoryRefresh();
				
				break;
			// 목록 가져오기에 성공하면 toast 를 띄운다.
			case THREAD_GROUP_CATEGORY_LIST_SUCCESS : 
				break;
			// 목록 가져오기에 실패하면 dialog 를 띄운다.
			case THREAD_GROUP_CATEGORY_LIST_FAIL :  
				break;
			// Group 을 수정 한다.
			case THREAD_GROUP_UPDATE : 
				threadUpateGroup();
				break;
			// Group 수정에 성공하면 toast 를 띄운다.
			case THREAD_GROUP_UPDATE_SUCCESS : 
				showUpdateGroupToast();
				break;
			// Group 수정에 실패하면 dialog 를 띄운다.
			case THREAD_GROUP_UPDATE_FAIL : 
				showUpdateGroupFail();
				break;
			// Group 을 비활성화 한다.
			case THREAD_GROUP_DEACTIVATE : 
				threadUpateDeactivateGroup();
				break;
			// Group 비활성화에 성공하면 toast 를 띄운다.
			case THREAD_GROUP_DEACTIVATE_SUCCESS : 
				showUpdateDeactivateGroupToast();
				break;
			// Group 비활성화에 실패하면 dialog 를 띄운다.
			case THREAD_GROUP_DEACTIVATE_FAIL : 
				showUpdateDeactivateGroupFail();
				break;
			}
		}
	};

	/**
	 * 리스트의 특정 라인을 터치하면 category 분석 페이지로 이동 한다.
	 * 
	 * 일반 모드일때만 작동한다.
	 */
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		// TODO Auto-generated method stub
		super.onListItemClick(l, v, position, id);
		
//		Toast.makeText(this, "category id 	   : " + categoryViewList.get(position).getIdMyHistoryCategories()
//					+ "\n" + "category name    : " + categoryViewList.get(position).getName()
//					+ "\n" + "category comment : " + categoryViewList.get(position).getComment(), Toast.LENGTH_SHORT).show();
		
		
		
		if(("COMMON").equals(MODE)) {
			Intent i = new Intent(this, DayveCategoryAnalysisView.class);
			
			i.putExtra("position", position);
			
			i.putExtra("idMyHistoryCategories", categoryViewList.get(position).getIdMyHistoryCategories());
			i.putExtra("name", categoryViewList.get(position).getName());
			i.putExtra("comment", categoryViewList.get(position).getComment());
			i.putExtra("iconUrl", categoryViewList.get(position).getIconUrl());
			i.putExtra("openCategoryYn", categoryViewList.get(position).getOpenCategoryYn());
			i.putExtra("favoriteYn", categoryViewList.get(position).getFavoriteYn());
			i.putExtra("myHistoryMembersId", DAYVE_ID);
			
			Log.i(TAG, "idMyHistoryCategories : " + categoryViewList.get(position).getIdMyHistoryCategories());
			Log.i(TAG, "name                  : " + categoryViewList.get(position).getName());
			Log.i(TAG, "comment               : " + categoryViewList.get(position).getComment());
			Log.i(TAG, "iconUrl               : " + categoryViewList.get(position).getIconUrl());
			Log.i(TAG, "openCategoryYn        : " + categoryViewList.get(position).getOpenCategoryYn());
			Log.i(TAG, "favoriteYn            : " + categoryViewList.get(position).getFavoriteYn());
			
			startActivityForResult(i, 0);
		}
	}

	/* (non-Javadoc)
	 * @see android.app.Activity#onResume()
	 */
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		
		int lid = this.getResources().getIdentifier(DAYVE_GROUP_ICON_NAME, "drawable", this.getPackageName());
		imgViewGroupInformationGroupIcon.setImageResource(lid);
		
//		if(categoryDatabaseHandler == null || !categoryDatabaseHandler.getSQLiteDatabase().isOpen()){ 
//			categoryDatabaseHandler = DayveCategoryDatabaseHandler.open(getApplicationContext());
//		}
		
		Log.e(TAG, "RESULT_CATEGORY_REGISTER : " + RESULT_CATEGORY_REGISTER);
		Log.e(TAG, "ACTIVITY_RESULT          : " + ACTIVITY_RESULT);
		
		if(("").equals(RESULT_CATEGORY_REGISTER)) {
			Log.e(TAG, ">>>> onResume : RESULT_CATEGORY_UPDATE is space. --> THREAD_CATEGORY_LIST" );

			mHandler.sendMessage(mHandler.obtainMessage(THREAD_GROUP_CATEGORY_LIST));
		} else if(("SUCCESS").equals(RESULT_CATEGORY_REGISTER)) {
			Log.e(TAG, ">>>> onResume : RESULT_CATEGORY_UPDATE is not space. --> THREAD_CATEGORY_LIST_REFRESH" );

			mHandler.sendMessage(mHandler.obtainMessage(THREAD_GROUP_CATEGORY_REFRESH));
		}
		
		/**
		 * 화면 출력이 완료되면 onActivityResult 실행 파라메터를 초기화 한다.
		 */
		ACTIVITY_RESULT = "";
		
		// main thread 에서 child thread 를 호출 한다.
		Thread thread = new Thread(null, insertLogBackgroundThreadProcessing, "Background_insertLog");
		thread.start();
	}

	/* (non-Javadoc)
	 * @see android.app.Activity#onStop()
	 */
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		
//		dbHandler.close();
	}
	
	/* 최상위 프로세스가 아닐 경우 프로세스를 종료 한다.
	 * 
	 * => Home Key 를 눌렀을때 프로세스를 종료 한다.
	 * 
	 * @see android.app.Activity#onPause()
	 */
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		
		if(!isForegrdound()) {
//			System.exit(0);
		}
	}
	
	/**
	 * 현재 프로세스가 최상위로 실행중인지 검사 한다.
	 * 
	 * true : 최상위
	 * 
	 * @return
	 */
	public boolean isForegrdound() {
	    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
	    List<RunningTaskInfo> list = am.getRunningTasks(1);
	    ComponentName cn = list.get(0).topActivity;
	    String name = cn.getPackageName();
	     
	    return name.indexOf(getPackageName()) > -1;
	}
	
	/* (non-Javadoc)
	 * @see android.app.Activity#onActivityResult(int, int, android.content.Intent)
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		
		if(requestCode == 0) {
			if(resultCode == RESULT_OK) {
//				mHandler.sendMessage(mHandler.obtainMessage(THREAD_GROUP_CATEGORY_REFRESH));
				finish();
			}
		}
	}

	/**
	 * Group 을 수정 한다.
	 * 
	 * 실제 로직은 updateGroup 메소드에서 처리한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadUpateGroup() {
		Log.i(TAG, "threadUpateGroup");
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				updateGroup();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * Group 을 수정 한다.
	 */
	private void updateGroup() {
		Log.i(TAG, "updateGroup");
		
		DayveGroup parameterGroup = new DayveGroup();
		
		parameterGroup.setIdMyHistoryGroups(groupId);
		parameterGroup.setName(edtTextGroupInformationGroupName.getText().toString().trim());
		parameterGroup.setComment(edtTextGroupInformationGroupComment.getText().toString().trim());
		parameterGroup.setIconUrl(DAYVE_GROUP_ICON_NAME);
		parameterGroup.setOpenGroupYn(groupOpenGroupYn);
		parameterGroup.setFavoriteYn(groupFavoriteYn);
		parameterGroup.setActivateYn(groupActivateYn);
		parameterGroup.setModifyDate(currentDate);
		parameterGroup.setMyHistoryMembersId(DAYVE_ID);
		
		try {
			RESULT_UPDATE_GROUP = dayveGroupRest.updateGroup(parameterGroup).getResult().toString();
			
			Log.i(TAG, "RESULT_UPDATE_GROUP : " + RESULT_UPDATE_GROUP);
			
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}
		
		/**
		 * 결과에 따라서 다이얼로그 창을 띄운다.
		 * 
		 * 성공하면 등록화면을 닫고 카테고리 목록 화면으로 이동 한다.
		 * 실패하면 다이얼로그 창을 띄워서 다시 등록할 것인지 확인 한다.
		 */
		if(("SUCCESS").equals(RESULT_UPDATE_GROUP)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_GROUP_UPDATE_SUCCESS));

			// 화면을 닫는다.
			DayveGroupView.RESULT_GROUP_REGISTER = "SUCCESS";
			DayveGroupView.GROUP_MODE = "PROCESS";
			
			DayveCategoryView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			DayveFavoriteView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			DayveItemView.RESULT_ITEM_REGISTER = "SUCCESS";

			Intent i = new Intent();
			setResult(RESULT_OK, i);
			
			/**
			 * 화면을 닫는다.
			 * Group 목록 탭화면에서는 refresh 를 한다.
			 */
			finish();
		} else {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_GROUP_UPDATE_FAIL));
		}
	}
	
	/**
	 * Group 수정 성공 Toast 를 띄운다.
	 */
	private void showUpdateGroupToast() {
		CharSequence text = "그룹 수정 성공";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 * Group 수정 실패 dialog 창을 띄운다.
	 */
	private void showUpdateGroupFail() {
		Log.e(TAG, "showDialogRegisterCategoryFail");
		
		new AlertDialog.Builder(DayveGroupInformationView.this)
		.setTitle("그룹 수정 확인")
		.setMessage("그룹 수정에 실패 했습니다." + "\n" + "다시 시도해 주시기 바랍니다.")
		.setPositiveButton("확인", 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * Group 을 비활성화 한다.
	 * 
	 * 실제 로직은 updateDeactivateGroup 메소드에서 처리한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadUpateDeactivateGroup() {
		Log.i(TAG, "threadUpateDeactivateGroup");
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				updateDeactivateGroup();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * Group 을 비활성화 한다.
	 */
	private void updateDeactivateGroup() {
		Log.i(TAG, "updateDeactivateGroup");
		
		DayveGroup parameterGroup = new DayveGroup();
		
		parameterGroup.setIdMyHistoryGroups(groupId);
		parameterGroup.setActivateYn("N");
		parameterGroup.setModifyDate(currentDate);
		parameterGroup.setMyHistoryMembersId(DAYVE_ID);
		
		try {
			RESULT_DEACTIVE_GROUP = dayveGroupRest.updateDeactivateGroup(parameterGroup).getResult().toString();
			
			Log.i(TAG, "RESULT_DEACTIVE_GROUP : " + RESULT_DEACTIVE_GROUP);
			
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}
		
		/**
		 * 결과에 따라서 다이얼로그 창을 띄운다.
		 * 
		 * 성공하면 등록화면을 닫고 카테고리 목록 화면으로 이동 한다.
		 * 실패하면 다이얼로그 창을 띄워서 다시 등록할 것인지 확인 한다.
		 */
		if(("SUCCESS").equals(RESULT_DEACTIVE_GROUP)) {
			Log.i(TAG, "RESULT_DEACTIVE_CATEGORY : " + RESULT_DEACTIVE_GROUP);
			
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_GROUP_DEACTIVATE_SUCCESS));
			
			// Group, Category, Item 모두 화면이 열리면 refresh 한다.
//			DayveGroupView.RESULT_GROUP_REGISTER = "SUCCESS";
			DayveGroupView.RESULT_GROUP_DELETE = "SUCCESS";
			DayveGroupView.GROUP_MODE = "PROCESS";

			DayveCategoryView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			DayveFavoriteView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			DayveItemView.RESULT_ITEM_REGISTER = "SUCCESS";
			
			Intent i = new Intent();
			setResult(RESULT_OK, i);
			
			
			
			
			/**
			 * 화면을 닫는다.
			 * Group 목록 탭화면에서는 refresh 를 한다.
			 */
			finish();
		} else {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_GROUP_DEACTIVATE_FAIL));
		}
	}
	
	/**
	 * Group 비활성화 성공 Toast 를 띄운다.
	 */
	private void showUpdateDeactivateGroupToast() {
		Log.i(TAG, "showUpdateDeactivateGroupToast");
		
		CharSequence text = "그룹 삭제 성공";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 * Group 비활성화 실패 dialog 창을 띄운다.
	 */
	private void showUpdateDeactivateGroupFail() {
		Log.e(TAG, "showUpdateDeactivateGroupFail");
		
		new AlertDialog.Builder(DayveGroupInformationView.this)
		.setTitle("그룹 삭제 확인")
		.setMessage("그룹 삭제에 실패 했습니다." + "\n" + "다시 시도해 주시기 바랍니다.")
		.setPositiveButton("확인", 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * server 에서 category 목록을 다시 가져 온다.
	 * 
	 * 실제 체크는 login 메소드에서 처리한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadSelectCategoryRefresh() {
		Log.i(TAG, "threadSelectCategoryRefresh");
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		categoryList = new ArrayList<DayveCategory>();
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				selectCategoryRefresh();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * server 에서 category 목록을 다시 가져 온다.
	 * 
	 * 모든 데이터를 한번에 다 가져 온다.
	 */
	private void selectCategoryRefresh() {
		Log.i(TAG, "selectCategoryRefresh");

		/**
		 * Database 를 open 한다.
		 */
		categoryDatabaseHandler = DayveCategoryDatabaseHandler.open(getApplicationContext());
		
		// 기존의 데이터를 삭제 한다.
		categoryDatabaseHandler.deleteDayveCategory();
		categoryDatabaseHandler.close();
		
		DayveCategory parameterCategory = new DayveCategory();
		
		parameterCategory.setActivateYn("Y");
		parameterCategory.setCategoryStart(0);
		parameterCategory.setCategoryCount(1000000);		// 한번에 모두 가져오기 위해서 10000000.
		parameterCategory.setMyHistoryMembersId(DAYVE_ID);
		
		categoryDatabaseHandler = DayveCategoryDatabaseHandler.open(getApplicationContext());
		
		categoryDatabaseHandler.beginTransaction();
		
		try {
			categoryList = dayveCategoryRest.selectCategoryList(parameterCategory);
			
			Log.e(TAG, "categoryList size : " + categoryList.size());
			
			for(int i=0 ; i<categoryList.size() ; i++) {
				ContentValues values = new ContentValues();
				
				values.put("id_myhistory_categories", categoryList.get(i).getIdMyHistoryCategories());
				values.put("name", categoryList.get(i).getName());
				values.put("comment", categoryList.get(i).getComment());
				values.put("icon_url", categoryList.get(i).getIconUrl());
				values.put("open_category_yn", categoryList.get(i).getOpenCategoryYn());
				values.put("favorite_yn", categoryList.get(i).getFavoriteYn());
				values.put("activate_yn", categoryList.get(i).getActivateYn());
				values.put("modify_date", categoryList.get(i).getModifyDate());
				values.put("register_date", categoryList.get(i).getRegisterDate());
				values.put("myhistory_members_id", categoryList.get(i).getMyHistoryMembersId());
				values.put("items_count", categoryList.get(i).getItemsCount());
				
//				Log.i(TAG, "id_myhistory_categories              : " + categoryList.get(i).getIdMyHistoryCategories());
//				Log.i(TAG, "name                                 : " + categoryList.get(i).getName());
//				Log.i(TAG, "comment                              : " + categoryList.get(i).getComment());
//				Log.i(TAG, "open_category_yn                     : " + categoryList.get(i).getOpenCategoryYn());
//				Log.i(TAG, "favorite_yn                          : " + categoryList.get(i).getFavoriteYn());
//				Log.i(TAG, "activate_yn                          : " + categoryList.get(i).getActivateYn());
//				Log.i(TAG, "modify_date                          : " + categoryList.get(i).getModifyDate());
//				Log.i(TAG, "register_date                        : " + categoryList.get(i).getRegisterDate());
//				Log.i(TAG, "group_name                           : " + categoryList.get(i).getGroupName());
//				Log.i(TAG, "group_unit                           : " + categoryList.get(i).getGroupUnit());
//				Log.i(TAG, "group_unit_time                      : " + categoryList.get(i).getGroupUnitTime());
//				Log.i(TAG, "myhistory_members_id                 : " + categoryList.get(i).getMyHistoryMembersId());
//				Log.i(TAG, "items_count                          : " + categoryList.get(i).getItemsCount());
//				Log.i(TAG, "myhistory_groups_id_myhistory_groups : " + categoryList.get(i).getMyHistoryGroupsIdMyHistoryGroups());
//				Log.i(TAG, "------------------------------------------------------------");
				
				categoryDatabaseHandler.insertDayveCategory(values);
			}
			
			categoryDatabaseHandler.setTransactionSuccessful();
			
			Log.i(TAG, "Success to select category list.");
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			categoryDatabaseHandler.endTransaction();
			
			if(categoryDatabaseHandler != null) {
				categoryDatabaseHandler.close();
			}
		}
		
		/**
		 * 스크롤 이벤트에 의한 페이지 처리를 하지 않는다. 주석 처리 함.
		 * 출력 부분에서 직접 처리 함.
		 */
//		requestCount++;
//		categoryStart = requestCount * categoryCount;
		
		/**
		 * Database 를 close 한다.
		 */
		if(categoryDatabaseHandler != null) {
			categoryDatabaseHandler.close();
		}
		
		/**
		 * 출력하기 직전 기존의 화면 목록을 지운다.
		 */
//		categoryViewList.clear();
		
		// server 에서 가져온 목록을 database 에 저장하면 화면에 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_GROUP_CATEGORY_LIST));
		
		RESULT_CATEGORY_REGISTER = "";
//		RESULT_CATEGORY_UPDATE = "";
//		RESULT_CATEGORY_DELETE = "";
		ACTIVITY_RESULT = "";
	}
	
	/**
	 * Local Database 에서 category 목록을 가져 와서 출력 한다.
	 * 
	 * 스크롤 이벤트에 의한 페이징 처리를 한다.
	 */
	private Runnable selectCategoryList = new Runnable() {

		public void run() {
			// TODO Auto-generated method stub
			Log.i(TAG, "selectCategoryList");
			
			// 프로그레스 바를 출력 한다.
//			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
			
			if(!groupInformationProgressBar.isShown()) {
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
			}
			
			String _id = "0";
			
			int listSize = categoryViewList.size();
			
			if(listSize > 0 ) {
				_id = categoryViewList.get(listSize-1).get_id();
			}
			
			Log.e(TAG, ">> groupId : " + groupId);
			
			
			/**
			 * Database 를 연다.
			 */
			categoryDatabaseHandler = DayveCategoryDatabaseHandler.open(getApplicationContext());
			
			ArrayList<DayveCategory> resultList = categoryDatabaseHandler.selectCategoryListForGroup(groupId);
			
			categoryDatabaseHandler.close();
			
			categoryViewList.addAll(resultList);
			
			Log.e(TAG, ">> resultList.size() : " + resultList.size());
			
//			if(resultList.size() < categoryCount || 1000 < categoryViewList.size()) {
//				mLockListView = true;
//			} else {
//				mLockListView = false;
//			}
			
			Log.e(TAG, "categoryViewList : " + categoryViewList.size());
			
			// 만약 리스트가 없으면(등록된 카테고리가 없으면) toast 를 띄운다.
			if(categoryViewList.size() < 1) {
				showNoListToast();
			}
			
			dayveGroupInformationAdapter.notifyDataSetChanged();
			
			// 스크롤 이벤트의 페이징 처리를 위한 처리를 한다.
//			requestCount++;
//			categoryStart = requestCount * categoryCount;
			
			// 프로그레스 바를 감춘다.
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
			
			RESULT_CATEGORY_REGISTER = "";
			
			/**
			 * Database 를 닫는다.
			 */
//			if(categoryDatabaseHandler != null) {
//				categoryDatabaseHandler.close();
//			}
//			
//			categoryDatabaseHandler.close();
		}
		
	};
	
	/**
	 * 출력할 목록이 없다는 Toast 를 띄운다.
	 */
	private void showNoListToast() {
		CharSequence text = "리스트가 없습니다";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 * 로그를 저장 한다.
	 */
	private void insertLog() {
		Log.i(TAG, "insertLog");
		
		DayveLog dayveLog = new DayveLog();
		
		dayveLog.setId(DAYVE_ID);
		dayveLog.setViewName(TAG);
		dayveLog.setAccessDate(currentDate);
		
		try {
			dayveCommonRest.registerLog(dayveLog);
			Log.i(TAG, "Success to insert log.");
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		}
	}
	
	/**
	 * 로그 저장은 UI 와 관계 없기 때문에 background thread 로 구현 함 : child thread
	 */
	private Runnable insertLogBackgroundThreadProcessing = new Runnable() {
		
		public void run() {
			// TODO Auto-generated method stub
			insertLog();
		}
	};

}
